package com.atguigu.gmall.payment.controller;

import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.atguigu.gmall.common.service.RabbitService;
import com.atguigu.gmall.payment.config.AlipayConfig;
import com.atguigu.gmall.payment.service.AlipayService;
import com.atguigu.gmall.payment.service.PaymentInfoService;
import com.atguigu.gmall.product.client.common.result.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@Controller
@RequestMapping("/api/payment/alipay")
public class AliPayController {

    @Autowired
    private AlipayService alipayService;
    @Autowired
    private PaymentInfoService paymentInfoService;

    //调用支付宝生成二维码
    @GetMapping("/submit/{orderId}")
    @ResponseBody
    public String submit(@PathVariable Long orderId){
        return alipayService.submit(orderId);
    }

    //支付宝同步回调
    @GetMapping("/callback/return")
    public String callbackReturn(){
        return "redirect:" + AlipayConfig.return_order_url;
    }

    //支付异步通知
    @PostMapping("/callback/notify")
    public String callbackNotify(@RequestParam Map<String,String> paramMap){
        //将异步通知中收到的所有参数都存放在map中
        System.out.println("支付宝Post异步通知已经来过了");
        try {
            boolean signVerified = AlipaySignature.rsaCheckV1(   //确实是由支付宝公司发来的
                    paramMap,
                    AlipayConfig.alipay_public_key,
                    AlipayConfig.charset,
                    AlipayConfig.sign_type);  //调用SDK验证签名
            if(signVerified){
                //验签成功
                //异步通知成功
                //金额是否正确
                System.out.println(paramMap);
                //获取金额
                String total_amount = paramMap.get("total_amount");
                //获取状态
                String trade_status = paramMap.get("trade_status");
                if ("TRADE_SUCCESS".equals(trade_status)){
                    //用户已经支付了  并且支付金额也是正确的  成功
                    //发MQ   最终一致性   支付成功后续处理
                    //1. 金额也是正确的
                    //2. 更新支付信息表  银行流水 时间 内容
                    paymentInfoService.paySuccess(paramMap);

                    //3. 更新订单状态  未支付 该为 已支付
                    //4. 支付成功后 可能会收到一些优惠劵什么的  但是这个项目没有写
                    //5. 订单商品库存  扣减商品剩余库存

                    return "success";
                }else{
                    //交易状态是不正确的  失败
                    return "failure";
                }
                //校验金额是否正确
                //处理商户的业务  有可能超出一定时间 此时间内  你有没有返回success 支付宝再次发送异步通知
            }else{
                //验签失败  返回是啊比  failure
                return "failure";
            }

        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        //出现异常之后 走失败页面
        return "failure";
    }


    //退款
    @GetMapping("/refund/{outTradeNo}")
    @ResponseBody
    public Result refund(@PathVariable String outTradeNo){
        alipayService.refund(outTradeNo);
        return Result.ok();
    }







    //内网测试  外网穿透
    @GetMapping("/index")
    @ResponseBody
    public Result index(){
        return Result.ok();
    }


}
